Koa - микрофреймфорк, разработанный командой разработчиков фреймворка Express, и призванный использовать самые последние стандарты языка JavaScript.
Koa “предлагает” активно использовать самые последние стандарты в языке, включая синтаксис async/await, который позволяет избавиться от ужасно нечитаемого “callback hell” и является хорошей альтернативой построения цепочек Promise. Углубляться в синтаксис здесь не будем, это не тема статьи.
Сам Koa, являясь микрофреймворком, из коробки содержит только middleware систему, в нем даже нет маршрутизации. Все это можно получить, подключив необходимую функциональность в middleware chain.
В данной статье рассмотрим создание самого приложения Koa, и рассмотрим популярные навесы на него, для расширения функциональности.
Требования
Koa требует версию Node не меньше 7.6.0.
Использовать более старые версии можно, если подключить Babel, но тогда немного теряется посыл самого Koa (см. выше).
Т.к. мы собираемся использовать достаточно новые фичи языка, то лучше не скупиться, и ставить последнюю стабильную версию Node.
Подготовка среды
Про Node.js
Если Node не установлен, то вам необходимо сюда. Если же у вас еще и Linux или macOS, можно установить через менеджер пакетов - здесь сказано, как.
Чтобы проверить, что с Node все в порядке, можно набрать команду:
1 | $ node --version |
Она выведет текущую версию Node.
Также и про NPM (Node Package Manager) не забудем:
1 | $ npm --version |
Если хочется NVM (Node Version Manager), то вы наверняка знаете, что это такое, и проблем поставить нужную версию Node.js у вас не составит.
Установка зависимостей
Создайте директорию проекта, где будет храниться весь код. Откройте терминал и перейдите в данную директорию.
Инициализируем среду пакета. Это, как минимум, поможет нам хранить список зависимостей рядом с нашим кодом, а как максимум - создать полноценный пакет для распространения в сообщество.
1 | $ npm init |
NPM задаст несколько вопросов. Отвечаем хотя бы на имя пакета и имя автора.
1 | $ npm init |
У нас должен был появиться файл package.json.
Поставим koa:
1 | $ npm i koa |
Hello, World!
Создадим файл index.js, и заполним его слегка измененным стандартным примером Koa.
1 | const Koa = require('koa'); |
Код достаточно простой.
Мы создаем объект приложения. С помощью метода use мы цепляем новый middleware в цепочку. Все middleware будут выполняться по очереди с каждым запросом. В каждый middleware передаются два аргумента - ctx и next, где ctx - это, очевидно, контекст запроса, а next - следующая middleware в цепочке. В последнем middleware в цепочке next можно и не принимать (как в примере).
После чего мы говорим Koa слушать порт 3000. Небольшой callback позволяет нам понять, что сервер действительно запустился, а не завис.
Теперь можно запустить сервер:
1 | $ node index.js |
Если сервер успешно запустился, то можно зайти в браузер, и в адресной строке перейти по адресу localhost:3000. Должно отобразиться привычное всем Hello, World!.
Подронее про цепочки middleware, структуру контекста и события можно прочитать на сайте Koa.
С чем использовать
Альтернативы есть почти к каждому и ниже перечисленного. Их можно поискать в ссылках внизу статьи.
Koa-router
Библиотека позволяет получить необходимую функциональность роутинга запросов на разные обработчики. Без этого навеса навряд ли можно сделать что-то более менее серьезнее Hello, World!.
Кроме koa-router есть еще куча других аналогов, например более простой koa-route, которому сложно придумать какое-либо применение для грандиозных целей, и роутер с валидацией входящих и исходящих данных joi-router. Тем не менее, koa-router самый популярный на данный момент среди роутеров, и имеет сбалансированную функциональность, ничего лишнего.
1 | $ npm i koa-router |
1 | const Koa = require('koa'); |
Подробнее про koa-router можно почитать здесь.
Koa-bodyparser
Koa из коробки, как мы уже выяснили, мало что умеет. Парсить сложные запросы тоже.
Если нам нужно принимать запросы с JSON телом, то этот навес необходим.
1 | $ npm i koa-bodyparser |
1 | const Koa = require('koa'); |
Подробнее про koa-bodyparser можно почитать здесь.
Koa-logger
Логи того, что приходит, и что уходит, тоже нужны. Для разработки пойдет вариант koa-logger.
Выглядеть будет примерно так (взято из странички самого пакета):
1 | <-- GET / |
Не густо. Если хочется совсем много информации, то можно попробовать bunyan-logger.
1 | $ npm i koa-logger |
1 | const Koa = require('koa'); |
Репозиторий koa-logger здесь.
@koa/cors
CORS запросы иногда нужны, и это начинает доставлять головную боль, когда они недоступны.
1 | $ npm i @koa/cors@2 |
1 | const Koa = require('koa'); |
Репозиторий @koa/cors здесь.
Koa-compress
Сжатие ответов от сервера.
1 | $ npm i koa-compress |
1 | const Koa = require('koa'); |
Подробнее про koa-compress здесь.
Koa-session
Если необходимы сессии на cookie, то это неплохой вариант.
1 | $ npm i koa-session |
1 | const Koa = require('koa'); |
Подробнее про опции koa-session здесь.
Koa-JWT
Ну и, конечно, JWT. Очень полезны при разработке API. Быстрый пример к ним не привести, так что можно прочитать README в репозитории пакета.
1 | $ npm i koa-jwt |
Подробнее про koa-jwt здесь.
Вместо заключения
Koa, по сути, выполняет свою единственную важную функцию - это принимать запросы на сервер, и применять на них цепочку middleware. Это позволяет добиться хорошей гибкости в разработке приложения, и использовать только то, что необходимо.
Он также сильно похож на Express.
Так что проблем с ним возникнуть не должно.
Полезные ссылки
- koa (koajs.com)
- Koa examples
- Koa wiki - набор ссылок на все то, чем можно обвесить Koa для расширения его функциональности.
- Awesome Node.js - awesome-лист для Node.js.
- Awesome Koa - awesome-лист для Koa.